// TypeScript中的枚举数类之数字枚举
// 使用枚举我们可以定义一些带名字的常量
// 使用枚举可以清晰的表达意图或创建一组由区别的用例
// Tytpescript支持数字的和基于字符串的枚举
// 创造枚举类型的值的关键字是enum
var Direction;
(function (Direction) {
    Direction["UP"] = "0";
    Direction["DOWN"] = "11";
    Direction[Direction["LEFT"] = 99] = "LEFT";
    Direction[Direction["RIGHT"] = 100] = "RIGHT";
})(Direction || (Direction = {}));
// console.log(Direction);
// 如上, 我们定义了一个数字枚举
// UP使用初始化为1(这个也被称为初始化器)
// 其他成员会从1开始自动增长
// 换句话说,Direction
// UP的值为1
// DOWN为2
// LEFT为3
// RIGHT为4
var Direction2;
(function (Direction2) {
    Direction2[Direction2["UP"] = 0] = "UP";
    Direction2[Direction2["DOWN"] = 1] = "DOWN";
    Direction2[Direction2["LEFT"] = 2] = "LEFT";
    Direction2[Direction2["RIGHT"] = 3] = "RIGHT";
})(Direction2 || (Direction2 = {}));
// 我们还可以完全使用初始化器:
// up的值为0
// DOWN的值的自增长的行为是很有用处的
// 但是要注意每个枚举材料员的值是不同的
// 枚举类型response的最终值
// 本质来讲,枚举类型是一个名值对,和值名对的结合体
// 可以铜通过值来访问键名,也可以通过键名访问值
// Typescript中的枚举类型之数字枚举
// 不带初始化器的枚举要么放在倒数第一的位置,
// 要么被放在使用了数字常量或其他常量初始化了的枚举后面
// Typescript中的枚举类型之字符串枚举
var ldq;
(function (ldq) {
    ldq["a"] = "1";
    ldq[ldq["b"] = 1] = "b";
})(ldq || (ldq = {}));
console.log(ldq);
// Typescript 众多的枚举数据类型之异构(Heterogeneou)枚举
// 从技术的角度来说, 枚举可以混合字符串和数字成员,
// 但是不太建议
var BooleanLikeHeterogeneousEnum;
(function (BooleanLikeHeterogeneousEnum) {
    BooleanLikeHeterogeneousEnum[BooleanLikeHeterogeneousEnum["No"] = 0] = "No";
    BooleanLikeHeterogeneousEnum["Yes"] = "Yes";
})(BooleanLikeHeterogeneousEnum || (BooleanLikeHeterogeneousEnum = {}));
// Typrscript 中的枚举数据类型之计算成员
// 每个枚举成员都带有一个值,它可以是常量或计算出来的
// 当满足如下条件时,枚举成员被当作是常量
// 他是枚举的第一个成员且没有初始化器,这种情况下它被赋予值0
var E;
(function (E) {
    E[E["x"] = 0] = "x";
})(E || (E = {}));
console.log(E);
// 他不带有初始化器且它之前的枚举成员是一个数字常量
// 这种情况下,当前按枚举成员的值为它上一个枚举成员的值加一
var E1;
(function (E1) {
    E1[E1["x"] = 0] = "x";
    E1[E1["y"] = 1] = "y";
    E1[E1["z"] = 2] = "z";
})(E1 || (E1 = {}));
var E2;
(function (E2) {
    E2[E2["a"] = 1] = "a";
    E2[E2["b"] = 2] = "b";
    E2[E2["c"] = 3] = "c";
})(E2 || (E2 = {}));
console.log(E1);
console.log(E2);
// 枚举成员使用 常量枚举表达式初始化.
// 常量枚举表达式时Typescript表达式的子集
// 它可以在编译阶段求职
// 当表达式满足下面条件之一时
// 他就是一个常量枚举表达式
// (1).一个枚举表达式字面量(主要是字符串字面量或数字字面量)
// (2).一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的)
var E3;
(function (E3) {
    E3[E3["x"] = 0] = "x";
    E3[E3["y"] = 1] = "y";
    E3[E3["z"] = 2] = "z";
})(E3 || (E3 = {}));
var E4;
(function (E4) {
    E4[E4["A"] = 0] = "A";
    E4[E4["B"] = 1] = "B";
    E4[E4["C"] = 2] = "C";
})(E4 || (E4 = {}));
// (3).带括号的常量表达式(表达式返回值是常量,但是这个初始化没法用函数的返回值)
// (4).一元运算符 +,-,~其中之一应用在了
// (5).常量枚举表达式作为二元1运算符 +, -, *, /, %, <<, >>>, &, |, ^的操作对象
// 若常数枚举表达式求值后为 NAN或 Infinity, 则会在编译阶段报错
// Typescript中的枚举数据类型值联合枚举
// 存在一种特殊的会计算的常量枚举成员的自己:字面量枚举成员,
// 字面量枚举长成员是指不带有初始值的常量枚举成员,或者是值被初始化为
// 任何字符串字面量(例如:"foo","bar","baz")
// 任何数字字面量(例如:1,100)
// 应用了一元-符号的数字字面量(例如: -1, -100)
// 当所有枚举成员都拥有字面量枚举值时,它就带有了一种特殊的语义
// 首先,枚举成员成为了类型
// 例如,我们可以说某些成员 只能时枚举成员的值
var ShapeKind;
(function (ShapeKind) {
    // 不带初始值的常量枚举,默认从0开始
    ShapeKind[ShapeKind["Circle"] = 0] = "Circle";
    ShapeKind[ShapeKind["Square"] = 1] = "Square";
})(ShapeKind || (ShapeKind = {}));
var c = {
    // kind:ShapeKind.Square,
    kind: ShapeKind.Circle,
    radius: 100
};
var E5;
(function (E5) {
    E5[E5["x"] = 0] = "x";
    E5[E5["y"] = 1] = "y";
    E5[E5["z"] = 2] = "z";
})(E5 || (E5 = {}));
function f(obj) {
    return obj.x;
}
// 这个是完全没有问题的,E里面就是有一个值为数字的x属性
f(E);
// typescript 中的枚举数据类型之反向映射
// 除了创建一个以属性名作为对象成员之外
// 数字枚举成员还具有了 反向映射, 从枚举值到枚举名字
// 即通过名称得道值,也可以通过值得到名称
var Enum;
(function (Enum) {
    Enum[Enum["A"] = 0] = "A";
})(Enum || (Enum = {}));
var a = Enum.A;
var nameOfA = Enum[a]; //"A"
var directions = [
    0 /* UP */,
    1 /* DOWN */,
    2 /* LEFT */,
    3 /* RIGHT */
];
console.log.apply(console, directions);
